100 REM * MACRO EDITOR * 110 REM * FOR USE WITH * 120 REM * SID SEQUENCER * 130 REM * BY V.H.BERRY * 140 REM * C.1989 * 200 GOSUB 50010:REM INITIALISATION 210 GOSUB 35010:REM MAIN MENU 220 PRINT"[147]MACRO EDITOR." 230 PRINT"V.H.BERRY." 240 PRINT"C.1989." 250 END 5000 REM TEMPO CHANGE 5010 VL=PEEK(49275):VL=VL+I:IF VL=256 THEN VL=1 5020 IF VL=0 THEN VL=255 5030 POKE 49275,VL:POKE 49276,0 5040 RETURN 6000 REM SEQUENCER ON/OFF 6010 IF MF=0 THEN MF=1:SYS 49235:RETURN 6020 MF=0:SYS 49209:RETURN 15000 REM BLOCK EDITOR 15010 GOSUB 27010:REM EDIT SCREEN 15100 GET K$:IF K$="" THEN 15100 15102 IF K$="" THEN GOSUB 16030:SY=SY+1:GOSUB 16010:REM EDIT CURSOR DOWN 15104 IF K$="[145]" THEN GOSUB 16030:SY=SY-1:GOSUB 16010:REM EDIT CURSOR UP 15106 IF K$="" THEN GOSUB 16030:SX=SX+1:GOSUB 16010:REM EDIT CURSOR RIGHT 15108 IF K$="[157]" THEN GOSUB 16030:SX=SX-1:GOSUB 16010:REM EDIT CURSOR LEFT 15110 IF K$="[147]" THEN GOSUB 16510:GOSUB 27010:REM CLEAR CHANNEL 15120 IF K$="" THEN GOSUB 17010:GOSUB 27010:REM DELETE BLOCK 15130 IF K$="" THEN GOSUB 18010:REM WRITE BLOCK 15135 IF K$="" THEN GOSUB 16610:REM SET BEGIN MARKER 15136 IF K$="" THEN GOSUB 16610:REM SET END MARKER 15140 IF K$=" " THEN GOSUB 17510:REM INSERT BLOCK 15145 IF K$="" THEN POKE FSID,0:POKE FSID+7,0:POKE FSID+14,0:REM RESET NOTE COUNTERS 15150 IF K$="F" THEN GOSUB 30010:GOSUB 27010:REM CHANGE FILENAME 15160 IF K$="P" THEN PG=PG+1:GOSUB 27010:REM NEXT PAGE 15165 IF K$="[208]" THEN PG=PG-1:GOSUB 27010:REM PREVIOUS PAGE 15167 IF K$="+" THEN I=-1:GOSUB 5010:REM INCREASE TEMPO 15168 IF K$="-" THEN I=1:GOSUB 5010:REM DECREASE TEMPO 15170 IF K$=CHR$(133) THEN OS=OS+1:GOSUB 27010:REM F1 NEXT CHANNEL 15180 IF K$=CHR$(134) THEN GOSUB 28010:REM F3 HELP SCREEN 15190 IF K$=CHR$(135) THEN GOSUB 6010:REM F5 SEQUENCER ON/OFF 15200 IF K$=CHR$(136) THEN RETURN:REM F7 EXIT 15210 GOTO 15100 16000 REM CURSOR CONTROL 16010 IF SX>7 THEN SX=0 16015 IF SX<0 THEN SX=7 16020 IF SY>7 THEN SY=0 16025 IF SY<0 THEN SY=7 16030 Y$="":PRINT""; 16040 FOR I=0 TO SY 16050 PRINT""; 16060 NEXT 16070 FOR I=0 TO SX 16080 PRINT""; 16090 NEXT 16100 OPEN 1,3 16110 FOR I=1 TO 3 16120 GET#1,X$ 16130 Y$=Y$+X$ 16140 NEXT 16150 CLOSE 1 16155 IF FG=0 THEN PRINT"";:FG=1:GOTO 16160 16156 FG=0 16160 PRINT"[157][157][157]";Y$;"[146]" 16170 RETURN 16500 REM CLEAR CHANNEL 16510 PRINT" CLEAR CHANNEL DATA : PRESS [RETURN] [146]" 16520 GET K$:IF K$="" THEN 16520 16530 IF K$<>CHR$(13) THEN K$="":RETURN 16540 N(OS)=0 16550 POKE CH+(OS-1)*256,128 16560 POKE CH+(OS-1)*256+1,255 16570 RETURN 16600 REM SET BLOCK MARKERS 16610 VL=PG*64+SY*8+SX:IF VL>=N(OS) THEN RETURN 16620 IF K$="" THEN BM=VL 16630 IF K$="" THEN EM=VL 16640 GOSUB 16710:REM PRINT BLOCK VALUES 16650 GOSUB 21030:REM COLOUR SUBROUTINE 16660 RETURN 16700 REM PRINT BLOCK MARKER VALUES 16710 PRINT" [145]" 16720 PRINT"BLOCK:";BM+1;"-";EM+1 16730 RETURN 17000 REM DELETE BLOCK 17010 PRINT" DELETE BLOCK [146] " 17020 IF BM>EM THEN 18310:REM BLOCK ERROR 17030 IF MF=1 THEN GOSUB 6010:REM SEQ. OFF 17040 I=0 17050 POKE CH+(OS-1)*256+BM+I,PEEK(CH+(OS-1)*256+EM+I+1) 17060 IF PEEK(CH+(OS-1)*256+BM+I)=255 THEN N(OS)=N(OS)-(EM-BM+1):RETURN 17070 I=I+1 17080 GOTO 17050 17500 REM INSERT BLOCK 17510 VL=PG*64+SY*8+SX:IF VL>N(OS) THEN RETURN 17520 IF VL>254 OR N(OS)+EM-BM>255 THEN 18410:REM OVERFLOW 17525 IF BM>EM THEN 18310:REM BLOCK ERROR 17526 PRINT" INSERT BLOCK [146] " 17530 IF MF=1 THEN GOSUB 6010:REM SEQ. OFF 17540 FOR I=N(OS)+1 TO VL STEP -1 17550 POKE CH+(OS-1)*256+I+(EM-BM)+1,PEEK(CH+(OS-1)*256+I) 17560 NEXT 17570 IF BM>VL THEN GOSUB 18110:REM COPY UP 17575 IF EMN(OS) THEN RETURN 18020 IF VL>254 OR VL+EM-BM>254 THEN 18410:REM OVERFLOW 18025 IF BM>EM THEN 18310:REM BLOCK ERROR 18026 PRINT" WRITE BLOCK [146] " 18030 IF MF=1 THEN GOSUB 6010:REM SEQ. OFF 18040 IF EMVL THEN GOSUB 18110:REM COPY UP 18050 IF EM>VL OR BM3 THEN OS=1 21040 IF OS=1 THEN PRINT"" 21050 IF OS=2 THEN PRINT"[158]" 21060 IF OS=3 THEN PRINT"" 21070 RETURN 27000 REM NOTE EDIT SCREEN 27010 PRINT"[147] NEXT CHAN  HELP  SEQ ON/OFF  EXIT " 27020 PRINT" F1  F3  F5  F7 " 27070 PRINT"[176][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][174]" 27080 PRINT"}1}2}3}4}5}6}7}8}" 27090 PRINT"[176]```{```{```{```{```{```{```{```{```[179]" 27100 PRINT"}0+}}}}}}}}}" 27110 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27120 PRINT"}8+}}}}}}}}}" 27130 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27140 PRINT"}16+}}}}}}}}}" 27150 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27160 PRINT"}24+}}}}}}}}}" 27170 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27180 PRINT"}32+}}}}}}}}}" 27190 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27200 PRINT"}40+}}}}}}}}}" 27210 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27220 PRINT"}48+}}}}}}}}}" 27230 PRINT"[171]```{```{```{```{```{```{```{```{```[179]" 27240 PRINT"}56+}}}}}}}}}" 27250 PRINT"[173]```[177]```[177]```[177]```[177]```[177]```[177]```[177]```[177]```[189]" 27260 PRINT"FILE:";N$ 27265 GOSUB 16710:REM PRINT BLOCK VALUES 27270 GOSUB 21030:REM COLOUR SUBROUTINE 27280 PRINT"CHANNEL:";OS 27285 IF PG*64>N(OS) THEN PG=0 27286 IF PG<0 THEN PG=INT((N(OS)-1)/64) 27290 PRINT"NOTES:PAGE:[145]" 27300 PRINT TAB(9);N(OS);TAB(24);PG*64+1;"-";(PG+1)*64 27302 REM INITIALISE CURSOR CONTROLS 27304 SX=0:SY=0:FG=0 27310 REM PRINT NOTE DATA 27320 I=0:LL=0:PRINT""; 27330 VL=PEEK(CH+(OS-1)*256+PG*64+I) 27340 IF VL=128 THEN NL$="R ":GOTO 27385:REM REST 27350 IF VL=255 THEN NL$=": ":GOTO 27385:REM END OF DATA 27360 GOSUB 27510:REM NOTE/OCTAVE STRING 27385 PRINT NL$;""; 27390 I=I+1:IF I=64 OR VL=255 THEN GOSUB 16030:RETURN 27395 LL=LL+1:IF LL=8 THEN LL=0:PRINT:PRINT""; 27400 GOTO 27330 27500 REM NOTE LETTER/OCTAVE STRING 27510 OV=INT(VL/16):REM OCTAVE 27520 O$=STR$(OV):O$=RIGHT$(O$,1) 27530 NL$=L$(VL-OV*16):REM NOTE LETTER NAME 27540 NL$=NL$+O$:IF LEN(NL$)=2 THEN NL$=NL$+" " 27550 RETURN 28000 REM HELP SCREEN 28010 POKE 53280,5:POKE 53281,5:PRINT"[147]"; 28011 PRINT" PRESS [F7] TO EXIT : [176]`````````````````````````````"; 28012 PRINT"[192][192][192][192][192][192][192][192][192][174][221][F][146][144]CHA"; 28013 PRINT"NGEFILENAME}}}}[P]"; 28014 PRINT"[146][144]NEXTPAGE}}[SHIFT] & [P][146][144]PREVIOUSPAGE"; 28015 PRINT"}}}}[+][146][144]INCREAS"; 28016 PRINT"ETEMPO}}[-][146][144]DECREASETEMPO}}"; 28017 PRINT"}}[HOME][146][144]RESETNOTECOUNTERS"; 28018 PRINT"}}}}[146][144]EDITCONTROLS:[CRSR][146]"; 28019 PRINT"[144]MOVECURSOR}}[146][144]`````````````}}[CTRL] &"; 28020 PRINT" [B][146][144]'BEGIN'BLOCKMARK}}[CTRL] & [E][146][144]'END'BLOCKMARK"; 28021 PRINT"}}}}[CTRL] & [D][146][144]DELETE"; 28022 PRINT"BLOCK}}[CTRL] & [W][146][144]WRITEBLOCKATCRSR}}[CTRL] &"; 28023 PRINT" [I][146][144]INSERTBLOCKATCRSR}}"; 28024 PRINT"[221][221][SHIFT] & [CLR][146][144]CLEARCHANNEL[221]"; 28025 PRINT"[173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192]"; 28026 PRINT"[192][192][192][192][192][192][192][192][192][189]" 28160 GET K$:IF K$="" THEN 28160 28170 IF K$<>CHR$(136) THEN 28160 28180 K$="" 28190 POKE 53280,0:POKE 53281,0 28200 GOSUB 27010:REM NOTE EDIT ECREEN 28210 RETURN 30000 REM INPUT NEW FILENAME 30010 POKE 53280,5:POKE 53281,5 30020 PRINT"[147] ENTER NEW FILENAME : PRESS [RETURN] [146]"; 30030 PRINT 30040 PRINT"FILE : ";N$ 30050 PRINT"" 30060 L=14:TB=5:RS=1:GOSUB 32040:REM INPUT SUBROUTINE 30070 IF A>0 THEN N$=Y$ 30080 POKE 53280,0:POKE 53281,0 30090 RETURN 32000 REM INPUT RESTRICTION SUBROUTINE 32010 REM L=LENGTH OF INPUT 32020 REM TB=TABULATION OF ROUTINE 32030 REM RS=CHARACTER RESTRICTIONS 32040 A=0:Y$="":SP=1 32050 PRINT TAB(TB+L+1):PRINT"[145][174][157][189][145]";:FOR X=0 TO L+1:PRINT"[157][157] ";:NEXT:PRINT"[145][176][157][173][145][144][164][157]"; 32060 GET X$:IF X$="" THEN 32060 32070 IF X$=CHR$(160) OR X$=" " OR X$=CHR$(20) OR X$=CHR$(13) THEN 32130 32080 IF RS=0 THEN IF X$=>"0" AND X$=<"9" THEN 32130 32090 IF RS=1 AND X$=>CHR$(35) AND X$=CHR$(32) THEN SP=0 32170 IF A>L AND X$<>CHR$(20) THEN X$="":A=A-1 32180 IF A<1 THEN X$="":A=0 32190 IF X$=CHR$(20) THEN PRINT TAB(A)"[157][164] [157][157]";:A=A-2:Y$=LEFT$(Y$,LEN(Y$)-1):GOTO 32110 32200 IF X$=CHR$(32) AND SP=1 THEN X$="":A=A-1 32210 IF X$=CHR$(32) THEN SP=SP+1 32220 Y$=Y$+X$:PRINT X$;:IF A0 AND A<6 AND MF=1 THEN GOSUB 6010:REM TURN OFF SEQUENCER 37170 ON A+1 GOSUB 30010,42010,40010,40010,41010,45010 37180 GOTO 37020 38000 REM DISK COMMAND MENU 38010 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN] [146]" 38020 PRINT"***DISK COMMANDS***" 38030 PRINT"FILE : ";N$ 38040 PRINT" [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]" 38045 PRINT" DISK DIRECTORY " 38050 PRINT" INTIALISE DISK " 38060 PRINT" SCRATCH SID " 38070 PRINT" SCRATCH MUSIC " 38080 PRINT" SCRATCH BOTH " 38090 PRINT" VALIDATE DISK " 38100 PRINT" EXIT MENU " 38110 PRINT 38120 PRINT" [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]" 38130 PRINT"":T1=10:LL=6:GOSUB 39010:REM MENU SYSTEM ROUTINE 38140 RETURN 38500 REM DIRECTORY MENU 38505 IF DY*12>FI THEN DY=0 38510 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN] [146]" 38520 PRINT"***DISK DIRECTORY***" 38525 PRINT"BLOCKS FREE : ";BF 38530 PRINT" [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]" 38540 PRINT" ";N$;"" 38550 FOR I=12*DY TO 11+(12*DY) 38555 IF I>FI THEN PRINT:GOTO 38570 38560 PRINT" ";FI$(I) 38570 NEXT I 38575 PRINT" NEXT PAGE" 38580 PRINT" [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]" 38590 PRINT"":T1=10:LL=13:GOSUB 39010:REM MENU SYSTEM ROUTINE 38592 IF A=13 THEN DY=DY+1:GOTO 38505 38593 IF A=0 THEN 38600 38594 IF LEN(FI$((A-1)+12*DY))<3 THEN 38600 38595 N$=LEFT$(FI$((A-1)+12*DY),LEN(FI$((A-1)+12*DY))-2) 38600 RETURN 39000 REM MENU SYSTEM ROUTINE 39010 A=0:PRINT TAB(T1);">" 39020 GET X$:IF X$="" THEN 39020 39030 IF A=LL AND X$=CHR$(17) THEN A=A-1:PRINT"[145][145]" 39040 IF A=0 AND X$=CHR$(145) THEN A=A+1:PRINT 39050 IF X$=CHR$(17) THEN A=A+1:PRINT TAB(T1);"[145] [157]>" 39060 IF X$=CHR$(145) THEN A=A-1:PRINT TAB(T1);"[145] [157][145]>" 39070 IF X$=CHR$(13) THEN RETURN 39080 GOTO 39020 40000 REM LOAD MUSIC FILE 40010 X$=".1":I=0:FG=0:IF A=3 THEN FG=1 40020 N=0:IF FG=1 THEN N=N(I+1) 40030 OPEN 15,8,15 40040 OPEN 2,8,2,N$+X$+",S,R" 40050 INPUT#15,EN,ER$,TR,SE 40060 IF EN<>0 THEN PRINT"[147] LOAD[146]";:GOTO 44010 40070 PRINT" LOADING MUSIC FILE : [146]"; 40080 INPUT#2,A 40090 POKE CH+I*256+N,A 40095 IF N=255 THEN POKE CH+I*256+N,255:GOTO 40110 40100 IF A<>255 THEN N=N+1:GOTO 40080 40110 N(I+1)=N 40120 CLOSE 2 40130 CLOSE 15 40140 IF I=0 THEN I=1:X$=".2":GOTO 40020 40150 IF I=1 THEN I=2:X$=".3":GOTO 40020 40160 RETURN 41000 REM SAVE MUSIC FILE 41010 X$=".1":I=0 41020 N=0 41030 OPEN 15,8,15 41040 OPEN 2,8,2,N$+X$+",S,W" 41050 INPUT#15,EN,ER$,TR,SE 41060 IF EN<>0 THEN PRINT"[147] SAVE[146]";:GOTO 44010 41070 PRINT" SAVING MUSIC FILE : [146]"; 41080 A=PEEK(CH+I*256+N) 41090 PRINT#2,A 41100 IF A<>255 THEN N=N+1:GOTO 41080 41110 CLOSE 2 41120 CLOSE 15 41130 IF I=0 THEN I=1:X$=".2":GOTO 41020 41140 IF I=1 THEN I=2:X$=".3":GOTO 41020 41150 RETURN 42000 REM LOAD FSID REGISTERS 42010 OPEN 15,8,15 42020 OPEN 2,8,2,N$+".S,S,R" 42030 INPUT#15,EN,ER$,TR,SE 42040 IF EN<>0 THEN PRINT"[147] LOAD[146]";:GOTO 44010 42050 PRINT" LOADING SOUND FILE : [146]"; 42060 INPUT#2,A 42070 POKE 49275,A 42080 FOR CE=0 TO 2 42090 FOR REG=0 TO 6 42100 INPUT#2,A 42110 POKE FSID+REG+7*CE,A 42120 NEXT REG,CE 42130 CLOSE 2 42140 CLOSE 15 42150 RETURN 44000 REM FILE ERROR ROUTINE 44010 CLOSE 2:CLOSE 15 44020 PRINT" ERROR : PRESS [RETURN] [146]";:PRINT 44030 PRINT"FILE : ";N$ 44040 PRINT"ERROR # : ";EN:PRINT"";ER$:PRINT"TR = ";TR;" : SE = ";SE 44050 GET K$:IF K$<>CHR$(13) THEN 44050 44060 RETURN 45000 REM DISK ROUTINES 45010 OPEN 15,8,15 45020 GOSUB 38010:REM DISK COMMAND MENU 45030 IF A=6 THEN CLOSE 15:RETURN 45035 IF MF=1 THEN GOSUB 6010:REM TURN OFF SEQUENCER 45037 IF A=0 THEN GOSUB 45300:GOSUB 38510:GOTO 45020:REM DIRECTORY 45040 IF A>1 THEN 45080 45050 PRINT" INTIALISE DISK : [146]" 45060 PRINT#15,"I" 45070 GOTO 45020 45080 IF A<>5 THEN 45120 45090 PRINT" VALIDATE DISK : [146]" 45100 PRINT#15,"V" 45110 GOTO 45020 45120 IF A=2 THEN 45160 45125 PRINT" SCRATCH MUSIC FILE : [146]" 45130 PRINT#15,"S:"+N$+".1" 45132 PRINT#15,"S:"+N$+".2" 45134 PRINT#15,"S:"+N$+".3" 45150 IF A=3 THEN 45020 45160 PRINT" SCRATCH SOUND FILE : [146]" 45170 PRINT#15,"S:"+N$+".S" 45180 GOTO 45020 45200 REM DISK DIRECTORY READ 45300 I=0:FI$(I)="" 45310 OPEN 1,8,0,"$0" 45320 GET#1,A$,B$ 45330 GET#1,A$,B$ 45340 GET#1,A$,B$ 45350 C=0 45360 IF A$<>"" THEN C=ASC(A$) 45370 IF B$<>"" THEN C=C+ASC(B$)*256 45380 BF=C 45390 GET#1,B$:IF ST<>0 THEN 45470 45400 IF B$<>CHR$(34) THEN 45390 45410 GET#1,B$:IF B$<>CHR$(34) THEN FI$(I)=FI$(I)+B$:GOTO 45410 45420 GET#1,B$:IF B$=CHR$(32) THEN 45420 45425 IF RIGHT$(FI$(I),2)=".1" THEN FI$(I)=LEFT$(FI$(I),LEN(FI$(I))-1)+"M":I=I+1 45426 IF RIGHT$(FI$(I),2)=".S" THEN I=I+1 45427 IF I=37 THEN 45470 45430 C$="":FI$(I)="" 45440 C$=C$+B$:GET#1,B$:IF B$<>"" THEN 45440 45450 IF ST=0 THEN 45330 45460 CLOSE 1 45470 FI=I:DY=0 45480 CLOSE 1:RETURN 46000 REM HORIZONTAL HARDCOPY 46010 OPEN 4,4 46012 PRINT#4,CHR$(27);CHR$(108);CHR$(6):REM LEFT MARGIN (COL=6) 46020 PRINT#4,"FILE: ";N$ 46030 FOR OS=1 TO 3 46040 PRINT#4,CHR$(13) 46042 PRINT#4,"CHANNEL:";OS 46044 PRINT#4,CHR$(13);PC$; 46046 J=0:GOSUB 46210:REM PRINT NOTE# 46051 FOR I=0 TO N(OS)-1 46052 VL=PEEK(CH+(OS-1)*256+I) 46054 IF VL=128 THEN NL$="R ":GOTO 46066:REM REST 46060 GOSUB 27510:REM NOTE/OCTAVE STRING 46066 PRINT#4,NL$;" "; 46068 LL=LL+1:IF LL=16 THEN J=J+4:GOSUB 46210:REM NEXT LINE 46070 NEXT I 46075 PRINT#4,CHR$(13) 46080 NEXT OS 46085 PRINT#4,CHR$(12) 46090 CLOSE 4 46100 RETURN 46200 REM PRINT NOTE# 46210 LL=0:Y$=MID$(PS$,J+1,4) 46220 PRINT#4,CHR$(13) 46230 PRINT#4,Y$;" "; 46250 RETURN 47000 REM VERTICAL HARDCOPY 47010 OPEN 4,4 47012 PRINT#4,CHR$(27);CHR$(108);CHR$(4):REM LEFT MARGIN (COL=4) 47020 PRINT#4,"FILE: ";N$ 47025 J=0 47030 GOSUB 46210:REM PRINT NOTE# 47035 PRINT#4,CHR$(13);" ";PC$; 47040 FOR OS=1 TO 3 47042 PRINT#4,CHR$(13) 47043 PRINT#4,"CHAN";OS;" "; 47050 VL=PEEK(CH+(OS-1)*256+LL+J*4) 47060 IF LL+J*4>=N(OS) THEN 47110:REM ABORT LINE 47070 IF VL=128 THEN NL$="R ":GOTO 47090:REM REST 47080 GOSUB 27510:REM NOTE/OCTAVE STRING 47090 PRINT#4,NL$;" "; 47100 LL=LL+1:IF LL<16 THEN 47050 47110 LL=0 47120 NEXT OS 47130 J=J+4 47140 IF J*4